package net.servir.censo.dao.jdbc;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import net.servir.censo.model.*;
import net.servir.censo.util.SMTPSend;
import net.servir.censo.dao.CensoDAO;
import oracle.jdbc.OracleTypes;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class JdbcCensoDAO implements CensoDAO {

	private SimpleJdbcTemplate jdbcTemplate;
	private DataSource dataSourceCenso;

	private CallableStatement callableStatement = null;
	private Connection conn = null;

	public LinkedList<Sistema> ObtenerSistema() {

		// TODO Los sistemas que se carguen deben ser los asignados al
		// Responsable
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("SELECT ID_SISTEMA, DESCRIPCION,"
						+ " ACRONIMO, COD_ETAPA,CON_AMBITOS FROM SISTEMA WHERE COD_ETAPA <> 'FINA' ");
		LinkedList<Sistema> obj = new LinkedList<Sistema>();
		for (Map<String, Object> rec : lSectorMaps) {
			Sistema s = new Sistema();
			s.setId_sistema((Number) rec.get("ID_SISTEMA"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			s.setAcronimo((String) rec.get("ACRONIMO"));
			s.setCon_ambitos((String) rec.get("CON_AMBITOS"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<Ambito> ObtenerAmbito(Number id_sistema) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("SELECT ID_SISTEMA, ID_AMBITO, "
						+ "DESCRIPCION, ESTADO FROM AMBITO WHERE ID_SISTEMA = "
						+ id_sistema + " AND ESTADO = '1'");
		LinkedList<Ambito> obj = new LinkedList<Ambito>();
		for (Map<String, Object> rec : lSectorMaps) {
			Ambito s = new Ambito();
			s.setId_sistema((Number) rec.get("ID_SISTEMA"));
			s.setId_ambito((Number) rec.get("ID_AMBITO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			s.setEstado((String) rec.get("ESTADO"));
			obj.add(s);
		}
		return obj;
	}

	public LinkedList<Ejecutora> ObtenerEjecutora(Number id_ejecutora) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("SELECT ID_EJECUTORA, ID_PLIEGO, DESCRIPCION, TELEFONO,"
						+ " UBIGEO, UBIGEO_RPT, COD_ESTADO_ENVIO, ID_NIVEL_GOBIERNO, ID_SISTEMA, ESTADO "
						+ "FROM EJECUTORA ID_EJECUTORA = "
						+ id_ejecutora
						+ " AND ESTADO = '1'");
		LinkedList<Ejecutora> obj = new LinkedList<Ejecutora>();
		for (Map<String, Object> rec : lSectorMaps) {
			Ejecutora s = new Ejecutora();
			s.setId_sistema((Number) rec.get("ID_SISTEMA"));
			s.setId_pliego((Number) rec.get("ID_PLIEGO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			s.setTelefono((String) rec.get("TELEFONO"));
			s.setUbigeo((String) rec.get("UBIGEO"));
			s.setUbigeo_rpt((String) rec.get("UBIGEO_RPT"));
			s.setCod_estado_envio((String) rec.get("COD_ESTADO_ENVIO"));
			s.setId_nivel_gobierno((Number) rec.get("ID_NIVEL_GOBIERNO"));
			s.setId_sistema((Number) rec.get("ID_SISTEMA"));
			s.setEstado((String) rec.get("ESTADO"));
			obj.add(s);
		}
		return obj;
	}

	@Deprecated
	public LinkedList<ResponsableIdentificacion> ObtenerResponsableIdentificacion(
			String dni) {
		String sql = "select r.id_responsable, r.dni, r.correo, r.clave, e.descripcion, "
				+ "p.nombres || ' ' || p.apellido_paterno as nombre "
				+
				// "to_char(e.fec_fin_censo,'dd/MM/YY') as fec_fin_censo, ROUND(e.fec_fin_censo - SYSDATE, 0) as plazo, "
				// +
				" ,res.id_ejecutora as id_ejecutora "
				+ "from responsable r join responsable_ejecutora_ambito res "
				+ "on r.id_responsable = res.id_responsable join ejecutora e "
				+ "on e.id_ejecutora = res.id_ejecutora join persona p "
				+ "on p.dni = r.dni and p.dni = '"
				+ dni
				+ "' and r.estado = '1' " + "and res.estado = '1'";
		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<ResponsableIdentificacion> obj = new LinkedList<ResponsableIdentificacion>();
		for (Map<String, Object> rec : lSectorMaps) {
			ResponsableIdentificacion s = new ResponsableIdentificacion();
			s.setId_responsable((Number) rec.get("ID_RESPONSABLE"));
			s.setDni((String) rec.get("DNI"));
			s.setCorreo((String) rec.get("CORREO"));
			s.setClave((String) rec.get("CLAVE"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			s.setNombre((String) rec.get("NOMBRE"));
			// s.setFec_fin_censo((String)rec.get("FEC_FIN_CENSO"));
			// s.setPlazo((Number)rec.get("PLAZO"));
			s.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
			obj.add(s);
		}
		return obj;
	}

	public ResponsableIdentificacion GetResponsableIdentificacion(String dni,
			Number idAmbito, Number idSistema) {

		ResponsableIdentificacion obj = null;
		String sql = "select r.id_responsable, r.dni, r.correo, r.clave, e.descripcion, "
				+ "p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres as nombre, "
				+ " res.id_ejecutora as id_ejecutora, r.cod_rol_responsable  "
				+ "from responsable r join responsable_ejecutora_ambito res "
				+ "on r.id_responsable = res.id_responsable join ejecutora e "
				+ "on e.id_ejecutora = res.id_ejecutora join persona p "
				+ "on p.dni = r.dni and p.dni = '"
				+ dni
				+ "' and r.estado = '1' "
				+ "and res.estado = '1' and res.id_ambito = "
				+ idAmbito.intValue();
		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
//		System.out
//				.println("GetResponsableIdentificacion===========================");
//		System.out.println(sql);
		for (Map<String, Object> rec : lSectorMaps) {
			obj = new ResponsableIdentificacion();
			obj.setId_responsable((Number) rec.get("ID_RESPONSABLE"));
			obj.setCod_rol_responsable((String) rec.get("COD_ROL_RESPONSABLE"));
			obj.setDni((String) rec.get("DNI"));
			obj.setCorreo((String) rec.get("CORREO"));
			obj.setClave((String) rec.get("CLAVE"));
			obj.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.setNombre((String) rec.get("NOMBRE"));
			// obj.setFec_fin_censo((String)rec.get("FEC_FIN_CENSO"));
			// obj.setPlazo((Number)rec.get("PLAZO"));
			obj.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
		}
		// Obtenemos los Sistemas y ambitos activos sobre el cual tiene acceso
		sql = "Select s.id_sistema,s.descripcion as sistema,s.acronimo as acronimo_sistema,s.cod_etapa as etapa_sistema,s.con_ambitos"
				+ " , a.id_ambito,a.descripcion as ambito, a.estado as estado_ambito"
				+ " from responsable r join responsable_ejecutora_ambito ra on r.id_responsable = ra.id_responsable"
				+ " join ambito a on ra.id_ambito = a.id_ambito"
				+ " join sistema s on a.id_sistema = s.id_sistema"
				+ " where DNI = '"
				+ dni
				+ "' and s.id_sistema = "
				+ idSistema
				+ " order by s.descripcion,a.descripcion";
		lSectorMaps = jdbcTemplate.queryForList(sql);
//		System.out.println("GetResponsableIdentificacion===========================");
//		System.out.println(sql);
		Number id_sistema_antes = 0;
		Number id_sistema = 0;
		Sistema sistema = null;
		Ambito ambito = null;
		List<Sistema> sistemasActivos = new ArrayList<Sistema>();
		for (Map<String, Object> rec : lSectorMaps) {
			id_sistema = (Number) rec.get("ID_SISTEMA");
			if (id_sistema.intValue() != id_sistema_antes.intValue()) {
				sistema = new Sistema();
				sistema.setId_sistema((Number) rec.get("ID_SISTEMA"));
				sistema.setAcronimo((String) rec.get("ACRONIMO_SISTEMA"));
				sistema.setCod_etapa((String) rec.get("ETAPA_SISTEMA"));
				sistema.setDescripcion((String) rec.get("SISTEMA"));
				sistema.setCon_ambitos((String) rec.get("CON_AMBITOS"));

				sistema.setAmbitos(new ArrayList<Ambito>());

				sistemasActivos.add(sistema);
			}
			ambito = new Ambito();
			ambito.setId_sistema((Number) rec.get("ID_SISTEMA"));
			ambito.setId_ambito((Number) rec.get("ID_AMBITO"));
			ambito.setDescripcion((String) rec.get("AMBITO"));
			ambito.setEstado((String) rec.get("ESTADO"));

			sistema.getAmbitos().add(ambito);

			id_sistema_antes = id_sistema;
		}
		obj.setSistemas_activos(sistemasActivos);

		return obj;
	}

	public List ObtenerRptEjecutorCenso(Number id_ambito, Number id_ejecutora) {

		List listaRptEjecutoraCenso = null;

		String sql = "	SELECT ID_SERVICIO_CIVIL, DNI, NOMBRES, ID_AMBITO, ID_EJECUTORA, F1, F2, F3, F4, F5, F6, F7,"
				+ "COD_ESTADO FROM RPT_EJECUTORA_CENSO WHERE ID_AMBITO = "
				+ id_ambito + " AND ID_EJECUTORA = " + id_ejecutora;
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			RptEjecutoraCenso e = new RptEjecutoraCenso();
			e.setId_servicio_civil((Number) rec.get("ID_SERVICIO_CIVIL"));
			e.setCod_estado((String) rec.get("COD_ESTADO"));
			e.setDni((String) rec.get("DNI"));
			e.setNombres((String) rec.get("NOMBRES"));
			// e.setId_sistema((Number)rec.get("ID_SISTEMA"));
			// e.setId_ejecutora((Number)rec.get("ID_EJECUTORA"));
			// e.setF1((String)rec.get("F1"));
			// e.setF2((String)rec.get("F2"));
			if (listaRptEjecutoraCenso == null)
				listaRptEjecutoraCenso = new ArrayList();
			listaRptEjecutoraCenso.add(e);
			e = null;
		}
		return listaRptEjecutoraCenso;
	}

	public void GenerarRptEjecutorCenso(Number id_ambito, Number id_ejecutora) {
		String sql = "call sp_ejecutora_censo(" + id_ejecutora + ","
				+ id_ambito + ")";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public void DeleteServicioCivil(Integer id_ambito, Integer id_servicio_civil) {
		String sql = "call sp_del_servicio_civil(" + id_servicio_civil + ","
				+ id_ambito + ")";
		try {
			jdbcTemplate.update(sql);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public Integer ValidarUsuario(String dni, String clave) {
		/*
		 * try { String cod_tipo_rep = ""; cod_tipo_rep = (String)
		 * this.jdbcTemplate
		 * .queryForObject("SELECT cod_rol_responsable FROM RESPONSABLE " +
		 * " where dni = '"+ dni + "' and clave = '" + clave +
		 * "' and  ESTADO = '1'", String.class, new Object[]{}); return
		 * cod_tipo_rep;
		 * 
		 * } catch (Exception e) { return null; }
		 */
		try {
			Integer idSistema = null;
			String sql = "select sis.id_sistema from responsable res, responsable_ejecutora_ambito rea, ambito amb, sistema sis "
					+ " where res.id_responsable = rea.id_responsable and amb.id_ambito = rea.id_ambito and sis.id_sistema = amb.id_sistema and dni = '"
					+ dni
					+ "' and clave = '"
					+ clave
					+ "' and  res.ESTADO = '1' AND REA.ID_EJECUTORA <> 0 AND REA.ESTADO_REGISTRO<>'0' AND REA.FEC_CIERRE >= TO_DATE(SYSDATE)";
//			System.out.println(sql);
			idSistema = this.jdbcTemplate.queryForInt(sql);
			return idSistema;

		} catch (Exception e) {
			System.out.println("error en conexi�n con base de datos");
			return null;
		}
	}

	public Integer ValidarUsuarioAmbito(String dni, String clave) {
		/*
		 * try { String cod_tipo_rep = ""; cod_tipo_rep = (String)
		 * this.jdbcTemplate
		 * .queryForObject("SELECT cod_rol_responsable FROM RESPONSABLE " +
		 * " where dni = '"+ dni + "' and clave = '" + clave +
		 * "' and  ESTADO = '1'", String.class, new Object[]{}); return
		 * cod_tipo_rep;
		 * 
		 * } catch (Exception e) { return null; }
		 */
		try {
			Integer idAmbito = null;
			idAmbito = this.jdbcTemplate
					.queryForInt("select rea.id_ambito from responsable res, responsable_ejecutora_ambito rea, ambito amb, sistema sis "
							+ " where res.id_responsable = rea.id_responsable and amb.id_ambito = rea.id_ambito and sis.id_sistema = amb.id_sistema and dni = '"
							+ dni
							+ "' and clave = '"
							+ clave
							+ "' and  res.ESTADO = '1'");
			return idAmbito;

		} catch (Exception e) {
			return null;
		}
	}

	public List ObtenerRptEjecutoraCenso(Number id_ejecutora, Number id_ambito,
			Number para_reporte, String dni, String nombre, String puesto_tipo,
			Number id_responsable) {

		CallableStatement cstmt = null;
		ResultSet rs = null;
		Connection conn = null;
		List listaRptEjecutoraCenso = new ArrayList();
//		System.out.println("ObtenerRptEjecutoraCenso(Number id_ejecutora, Number id_ambito,Number para_reporte,String dni,String nombre, String puesto_tipo,Number id_responsable)");
		Object temp;
//		System.out.println("puesto_tipo.equals('0') = "+ puesto_tipo.equals("0"));
		if (puesto_tipo.equals("0")) {
			try {
				conn = this.dataSourceCenso.getConnection();
				
				if (!id_responsable.equals(0)) {
//					System.out.println("call sp_persona_ejecutora_censo_p = " + id_responsable);
					cstmt = conn
							.prepareCall("{ call sp_persona_ejecutora_censo_p(?,?,?,?,?,?,?)}");
				} else {
					cstmt = conn
							.prepareCall("{ call sp_persona_ejecutora_censo(?,?,?,?,?,?)}");
				}
				cstmt.setInt(1, Integer.parseInt(id_ejecutora.toString()));
				cstmt.setInt(2, Integer.parseInt(id_ambito.toString()));
				cstmt.registerOutParameter(3, OracleTypes.CURSOR);
				cstmt.setInt(4, Integer.parseInt(para_reporte.toString()));
				cstmt.setString(5, dni);
				cstmt.setString(6, nombre);

				if (!id_responsable.equals(0)) {
					cstmt.setInt(7, Integer.parseInt(id_responsable.toString()));
				}

				cstmt.execute();
				rs = (ResultSet) cstmt.getObject(3);
				ResultSetMetaData rsm = rs.getMetaData();
				int totalCampos = rsm.getColumnCount();
				int numCamposDinamicos = totalCampos - 7;
				while (rs.next()) {
					RptEjecutoraCenso e = new RptEjecutoraCenso();
					// recorro todos los campos
					// El mode por defecto tiene 4 campos fijos
					String campos = "";
					for (int j = 0; j < totalCampos; j++) {
						temp = rs.getObject(j + 1);
						if (j == 0)
							e.setId_servicio_civil((Number) rs.getObject(j + 1));
						else if (j == 1)
							e.setDni((String) rs.getObject(j + 1));
						else if (j == 2)
							e.setEstado_equipo((String) rs.getObject(j + 1));
						else if (j == 3)
							e.setNombres((String) rs.getObject(j + 1));
						else if (j == 4)
							e.setCod_estado((String) rs.getObject(j + 1));
						else if (j == 5)
							e.setCorreo((String) rs.getObject(j + 1));
						else if (j == 6)
							e.setJefe((String) rs.getObject(j + 1));
						// Campos din�micos
						if (j > 7) {
							Integer numero_campo = j - 7;
							if (numero_campo == numCamposDinamicos)
								campos += "f" + numero_campo.toString().trim()
										+ ":'"
										+ ((String) rs.getObject(j + 1)).trim()
										+ "'";
							else
								campos += "f" + numero_campo.toString().trim()
										+ ":'"
										+ ((String) rs.getObject(j + 1)).trim()
										+ "',";
						}
					}
					// Adicional MZD -- para lectura din�mica de campos
					List<String> lval = new ArrayList<String>();
					List<String> lcol = new ArrayList<String>();
					for (int i = 9; i <= rs.getMetaData().getColumnCount(); i++) {
						lcol.add(rs.getMetaData().getColumnLabel(i));
						lval.add(rs.getString(i));
					}
					e.setList_cab_funcion(lcol);
					e.setList_val_funcion(lval);

					e.setCampos(campos);
					if (listaRptEjecutoraCenso == null)
						listaRptEjecutoraCenso = new ArrayList();
					listaRptEjecutoraCenso.add(e);
					e = null;
				}

			} catch (Exception e) {
				e.getMessage();
			} finally {
				if (!(rs == null)) {
					try {
						rs.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if (!(cstmt == null)) {
					try {
						cstmt.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if (!(conn == null)) {
					try {
						conn.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		} else {
			try {
				conn = this.dataSourceCenso.getConnection();
				cstmt = conn
						.prepareCall("{ call sp_persona_ejecutora_censo_pt(?,?,?,?,?,?)}");
				cstmt.setInt(1, Integer.parseInt(id_ejecutora.toString()));
				cstmt.setInt(2, Integer.parseInt(id_ambito.toString()));
				cstmt.registerOutParameter(3, OracleTypes.CURSOR);
				cstmt.setInt(4, Integer.parseInt(para_reporte.toString()));
				cstmt.setString(5, dni);
				cstmt.setString(6, nombre);
				cstmt.execute();
				rs = (ResultSet) cstmt.getObject(3);
				ResultSetMetaData rsm = rs.getMetaData();
				int totalCampos = rsm.getColumnCount();
				int numCamposDinamicos = totalCampos - 6;
				while (rs.next()) {
					RptEjecutoraCenso e = new RptEjecutoraCenso();
					// recorro todos los campos
					// El mode por defecto tiene 4 campos fijos
					String campos = "";
					for (int j = 0; j < totalCampos; j++) {
						temp = rs.getObject(j + 1);
						if (j == 0)
							e.setId_servicio_civil((Number) rs.getObject(j + 1));
						else if (j == 1)
							e.setDni((String) rs.getObject(j + 1));
						else if (j == 2)
							e.setNombres((String) rs.getObject(j + 1));
						else if (j == 3)
							e.setCod_estado((String) rs.getObject(j + 1));
						else if (j == 4)
							e.setCorreo((String) rs.getObject(j + 1));

						// Campos din�micos
						if (j > 5) {
							Integer numero_campo = j - 5;
							if (numero_campo == numCamposDinamicos)
								campos += "f" + numero_campo.toString().trim()
										+ ":'"
										+ ((String) rs.getObject(j + 1)).trim()
										+ "'";
							else
								campos += "f" + numero_campo.toString().trim()
										+ ":'"
										+ ((String) rs.getObject(j + 1)).trim()
										+ "',";
						}
					}
					// Adicional MZD -- para lectura din�mica de campos
					List<String> lval = new ArrayList<String>();
					List<String> lcol = new ArrayList<String>();
					for (int i = 7; i <= rs.getMetaData().getColumnCount(); i++) {
						lcol.add(rs.getMetaData().getColumnLabel(i));
						lval.add(rs.getString(i));
					}
					e.setList_cab_funcion(lcol);
					e.setList_val_funcion(lval);

					e.setCampos(campos);
					if (listaRptEjecutoraCenso == null)
						listaRptEjecutoraCenso = new ArrayList();
					listaRptEjecutoraCenso.add(e);
					e = null;
				}

			} catch (Exception e) {
				e.getMessage();
			} finally {
				if (!(rs == null)) {
					try {
						rs.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if (!(cstmt == null)) {
					try {
						cstmt.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if (!(conn == null)) {
					try {
						conn.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
//		System.out.println("AQUI");
		return listaRptEjecutoraCenso;
	}

	// public List ObtenerRptEjecutoraCensoDetalle(Number id_ejecutora, Number
	// id_ambito)
	// {
	//
	// CallableStatement cstmt = null;
	// ResultSet rs = null;
	// Connection conn = null;
	// List listaRptEjecutoraCenso = null;
	//
	// Object temp;
	// try{
	// conn = this.dataSourceCenso.getConnection();
	// cstmt = conn.prepareCall("{ call sp_persona_ejecutora_censo(?,?,?)}");
	// cstmt.setInt(1, Integer.parseInt(id_ejecutora.toString()));
	// cstmt.setInt(2, Integer.parseInt(id_ambito.toString()));
	// cstmt.registerOutParameter(3, OracleTypes.CURSOR);
	// cstmt.execute();
	// rs = (ResultSet) cstmt.getObject(3);
	// ResultSetMetaData rsm = rs.getMetaData();
	// int totalCampos = rsm.getColumnCount();
	// int numCamposDinamicos = totalCampos - 4;
	// while (rs.next()){
	// RptEjecutoraCenso e = new RptEjecutoraCenso();
	// // recorro todos los campos
	// // El mode por defecto tiene 4 campos fijos
	// String campos = "";
	// for (int j=0;j < totalCampos;j++){
	// temp = rs.getObject(j+1);
	// if (j == 0)
	// e.setId_servicio_civil((Number)rs.getObject(j+1));
	// else if (j == 1)
	// e.setDni((String)rs.getObject(j+1));
	// else if (j == 2)
	// e.setNombres((String)rs.getObject(j+1));
	// else if (j == 3)
	// e.setCod_estado((String)rs.getObject(j+1));
	//
	// // Campos din�micos
	// if (j > 3)
	// {
	// Integer numero_campo = j - 3 ;
	// if (numero_campo == numCamposDinamicos)
	// campos += "" + ((String)rs.getObject(j+1)).trim();
	// else
	// campos += "" + ((String)rs.getObject(j+1)).trim() + "|";
	// }
	// }
	//
	// e.setCampos(campos);
	// if (listaRptEjecutoraCenso == null) listaRptEjecutoraCenso = new
	// ArrayList();
	// listaRptEjecutoraCenso.add(e);
	// e = null;
	// }
	//
	// } catch(Exception e) {
	// e.getMessage();
	// }
	// finally {
	// if (!(rs==null)){
	// try {
	// rs.close();
	// } catch (SQLException e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	// }
	// if (!(cstmt==null)){
	// try {
	// cstmt.close();
	// } catch (SQLException e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	// }
	// if (!(conn==null)){
	// try {
	// conn.close();
	// } catch (SQLException e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	// }
	// }
	// return listaRptEjecutoraCenso;
	// }

	public List ObtenerRptResumenEjecutoraCenso_111(Number id_ejecutora,
			Number id_ambito) {

		CallableStatement cstmt = null;
		ResultSet rs = null;
		Connection conn = null;
		List listaRptResumenEjecutoraCenso = null;

		Object temp;
		try {
			conn = this.dataSourceCenso.getConnection();
			cstmt = conn
					.prepareCall("{ call sp_resumen_ejecutora_censo(?,?,?)}");
			cstmt.setInt(1, Integer.parseInt(id_ejecutora.toString()));
			cstmt.setInt(2, Integer.parseInt(id_ambito.toString()));
			cstmt.registerOutParameter(3, OracleTypes.CURSOR);

			cstmt.execute();
			rs = (ResultSet) cstmt.getObject(3);
			ResultSetMetaData rsm = rs.getMetaData();
			int columnCount = rsm.getColumnCount();
			while (rs.next()) {
				RptResumenEjecutoraCenso e = new RptResumenEjecutoraCenso();
				// for (int j=0;j< columnCount;j++){

				// temp = rs.getObject(j+1);

				e.setDescripcion((String) rs.getObject(1));
				if (rsm.getColumnCount() > 1)
					e.setF1((Number) rs.getObject(2));
				if (rsm.getColumnCount() > 2)
					e.setF2((Number) rs.getObject(3));
				if (rsm.getColumnCount() > 3)
					e.setF3((Number) rs.getObject(4));
				if (rsm.getColumnCount() > 4)
					e.setF4((Number) rs.getObject(5));
				if (rsm.getColumnCount() > 5)
					e.setF5((Number) rs.getObject(6));
				if (rsm.getColumnCount() > 6)
					e.setF6((Number) rs.getObject(7));
				if (rsm.getColumnCount() > 7)
					e.setF7((Number) rs.getObject(8));

				List<Integer> lval = new ArrayList<Integer>();
				List<String> lcol = new ArrayList<String>();
				for (int i = 2; i <= rs.getMetaData().getColumnCount(); i++) {
					lcol.add(rs.getMetaData().getColumnLabel(i));
					lval.add(rs.getInt(i));
				}
				e.setList_cab_funcion(lcol);
				e.setList_val_funcion(lval);
				if (listaRptResumenEjecutoraCenso == null)
					listaRptResumenEjecutoraCenso = new ArrayList();
				listaRptResumenEjecutoraCenso.add(e);
				e = null;

				// }
			}

		} catch (Exception e) {
			e.getMessage();
		} finally {
			if (!(rs == null)) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(cstmt == null)) {
				try {
					cstmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(conn == null)) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return listaRptResumenEjecutoraCenso;
	}

	public List ObtenerRptResumenEjecutoraCenso(Number id_ejecutora,
			Number id_ambito, Number id_responsable) {

		CallableStatement cstmt = null;
		ResultSet rs = null;
		Connection conn = null;
		List listaRptResumenEjecutoraCenso = null;

		Object temp;
		try {
			conn = this.dataSourceCenso.getConnection();

			if (id_responsable.equals(0)) {
				cstmt = conn
						.prepareCall("{ call sp_resumen_ejecutora_censo(?,?,?)}");
			} else {
				cstmt = conn
						.prepareCall("{ call sp_resumen_ejecutora_censo_p(?,?,?,?)}");
			}

			cstmt.setInt(1, Integer.parseInt(id_ejecutora.toString()));
			cstmt.setInt(2, 15);// solo aplica a snip2013
			// cstmt.setInt(2, Integer.parseInt(id_ambito.toString()));
			cstmt.registerOutParameter(3, OracleTypes.CURSOR);

			if (!id_responsable.equals(0)) {
				cstmt.setInt(4, Integer.parseInt(id_responsable.toString()));// solo
																				// aplica
																				// a
																				// snip2013
			}

			cstmt.execute();
			rs = (ResultSet) cstmt.getObject(3);
			ResultSetMetaData rsm = rs.getMetaData();
			int columnCount = rsm.getColumnCount();
			while (rs.next()) {
				RptResumenEjecutoraCenso e = new RptResumenEjecutoraCenso();
				// for (int j=0;j< columnCount;j++){

				// temp = rs.getObject(j+1);

				e.setDescripcion((String) rs.getObject(1));
				if (rsm.getColumnCount() > 1)
					e.setF1((Number) rs.getObject(2));
				if (rsm.getColumnCount() > 2)
					e.setF2((Number) rs.getObject(3));
				if (rsm.getColumnCount() > 3)
					e.setF3((Number) rs.getObject(4));
				if (rsm.getColumnCount() > 4)
					e.setF4((Number) rs.getObject(5));
				if (rsm.getColumnCount() > 5)
					e.setF5((Number) rs.getObject(6));
				if (rsm.getColumnCount() > 6)
					e.setF6((Number) rs.getObject(7));
				if (rsm.getColumnCount() > 7)
					e.setF7((Number) rs.getObject(8));

				List<Integer> lval = new ArrayList<Integer>();
				List<String> lcol = new ArrayList<String>();
				for (int i = 2; i <= rs.getMetaData().getColumnCount(); i++) {
					lcol.add(rs.getMetaData().getColumnLabel(i));
					lval.add(rs.getInt(i));
				}
				e.setList_cab_funcion(lcol);
				e.setList_val_funcion(lval);
				if (listaRptResumenEjecutoraCenso == null)
					listaRptResumenEjecutoraCenso = new ArrayList();
				listaRptResumenEjecutoraCenso.add(e);
				e = null;

				// }
			}

		} catch (Exception e) {
			e.getMessage();
		} finally {
			if (!(rs == null)) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(cstmt == null)) {
				try {
					cstmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(conn == null)) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return listaRptResumenEjecutoraCenso;
	}

	public List<FuncionLeyenda> RptFuncionLeyenda(Number id_ambito,
			Number idResponsable) {

		List<FuncionLeyenda> listaFuncionLeyenda = null;

		/*
		 * String sql =
		 * "select f.nemotecnico, f.descripcion from funcion f join etapa e on f.id_etapa = e.id_etapa "
		 * + " where e.id_ambito = " + id_ambito + " order by f.id_funcion ";
		 */
		String sql = "";
//		if (!idResponsable.equals(0)) {
//			sql = "select f.nemotecnico, f.descripcion, SE.ID_SISTEMA_ETAPA, SE.DES_SISTEMA_ETAPA, SE.ABREV_SISTEMA_ETAPA "
//					+ " from funcion f ,  etapa e, nivel_gobierno_funcion ng,funcion_personalizada  fp, SISTEMA_ETAPA SE "
//					+ " where f.id_etapa = e.id_etapa "
//					+ " AND E.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA "
//					+ " and f.id_funcion=ng.id_funcion"
//					+ " and E.ID_ETAPA= ng.id_etapa "
//					+ " and f.id_funcion=FP.ID_FUNCION "
//					+ " and  FP.ID_RESPONSABLE="
//					+ idResponsable
//					+ " and ng.id_nivel_gobierno= (select decode(ni.id_nivel_gobierno,1,5,ni.id_nivel_gobierno) from ejecutora ej,nivel_gobierno ni where ej.id_nivel_gobierno=ni.id_nivel_gobierno and id_ejecutora="
//					+ id_ambito
//					+ ")"
//					+ " order by se.id_sistema_etapa, f.nemotecnico";
//		} else {
			sql = "select f.nemotecnico, f.descripcion, SE.ID_SISTEMA_ETAPA, SE.DES_SISTEMA_ETAPA, SE.ABREV_SISTEMA_ETAPA "
					+ " from funcion f ,  etapa e, nivel_gobierno_funcion ng, CENSOABAST.SISTEMA_ETAPA SE "
					+ " where f.id_etapa = e.id_etapa "
					+ " AND E.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA "
					+ " and f.id_funcion=ng.id_funcion "
					+ " and E.ID_ETAPA= ng.id_etapa "
					//+ " and ng.id_nivel_gobierno= "
					//+ "	(select ni.id_nivel_gobierno from ejecutora ej,nivel_gobierno ni where ej.id_nivel_gobierno=ni.id_nivel_gobierno and id_ejecutora="
					//+ id_ambito
					//+ ")"
					+ " order by se.id_sistema_etapa, f.nemotecnico";
//		}
//		System.out.println("RptFuncionLeyenda (Number id_ambito,Number idResponsable) =======================");
//		System.out.println(sql);
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			FuncionLeyenda e = new FuncionLeyenda();
			e.setNemotecnico((String) rec.get("NEMOTECNICO"));
			e.setDescripcion((String) rec.get("DESCRIPCION"));
			e.setAbrev_sistema_etapa((String) rec.get("ABREV_SISTEMA_ETAPA"));
			e.setDes_sistema_etapa((String) rec.get("DES_SISTEMA_ETAPA"));
			e.setId_sistema_etapa((Number) rec.get("ID_SISTEMA_ETAPA"));
			e.setDescripcion_etapa_sistema(e.getAbrev_sistema_etapa() + "-"
					+ e.getDescripcion());
			if (listaFuncionLeyenda == null)
				listaFuncionLeyenda = new ArrayList();
			listaFuncionLeyenda.add(e);
			e = null;
		}
		return listaFuncionLeyenda;
	}

	public List RptFuncionLeyenda_old(Number id_ambito) {

		List listaFuncionLeyenda = null;

		String sql = "select f.nemotecnico, f.descripcion from funcion f join etapa e on f.id_etapa = e.id_etapa "
				+ " where e.id_ambito = "
				+ id_ambito
				+ " order by f.id_funcion ";
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			FuncionLeyenda e = new FuncionLeyenda();
			e.setNemotecnico((String) rec.get("NEMOTECNICO"));
			e.setDescripcion((String) rec.get("DESCRIPCION"));
			if (listaFuncionLeyenda == null)
				listaFuncionLeyenda = new ArrayList();
			listaFuncionLeyenda.add(e);
			e = null;
		}
		return listaFuncionLeyenda;
	}

	public List RptPuestoLeyenda(Number id_ambito) {
//		System.out.println("RptPuestoLeyenda (Number id_ambito) =======================");
		List listaFuncionLeyenda = null;
		String sql = "SELECT PT.PUESTO_TIPO AS DESCRIPCION, PT.NEMOTECNICO FROM PUESTO_TIPO PT, AMBITO AMB WHERE PT.ID_SISTEMA = AMB.ID_SISTEMA AND AMB.ID_AMBITO = "
				+ id_ambito + " order by PT.NEMOTECNICO ";
//		System.out.println(sql);
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			FuncionLeyenda e = new FuncionLeyenda();
			e.setNemotecnico((String) rec.get("NEMOTECNICO"));
			e.setDescripcion((String) rec.get("DESCRIPCION"));
			if (listaFuncionLeyenda == null)
				listaFuncionLeyenda = new ArrayList();
			listaFuncionLeyenda.add(e);
			e = null;
		}
		return listaFuncionLeyenda;
	}

	@Autowired
	public JdbcCensoDAO(DataSource dataSource) {
		this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
		this.dataSourceCenso = dataSource;
	}

	public Integer ObtenerNumeroFunciones(Integer idAmbito,
			Integer idResponsable) {
		try {
			Integer numeroFunciones = 0;
			/*
			 * String sql =
			 * "select count(id_funcion) as numero_funciones from funcion f " +
			 * "join etapa e on f.id_etapa = e.id_etapa join ambito a on e.id_ambito = a.id_ambito "
			 * + "where a.id_ambito = " + idAmbito;
			 */

			// String
			// sql="select count(fs.id_funcion) as numero_funciones from funcion fs, etapa es,responsable_ejecutora_ambito re where FS.ID_ETAPA= ES.ID_ETAPA and ES.ID_NIVEL_GOBIERNO = RE.ID_NIVEL_GOBIERNO and RE.ID_EJECUTORA="+idAmbito;//esto
			// es ejecutora

			// String
			// sql="select count(fs.id_funcion) as numero_funciones from funcion fs, etapa es,responsable_ejecutora_ambito re,ejecutora ej,nivel_gobierno ni where re.id_ejecutora=ej.id_ejecutora and ej.id_nivel_gobierno=ni.id_nivel_gobierno and FS.ID_ETAPA= ES.ID_ETAPA  and RE.ID_EJECUTORA="+idAmbito;
			String sql = "";
//			if (idResponsable != 0) {
//				sql = "SELECT COUNT (fs.id_funcion) AS numero_funciones FROM funcion fs,etapa es,nivel_gobierno_funcion ngf,funcion_personalizada  fp WHERE fs.id_funcion=ngf.id_funcion and es.id_etapa=ngf.id_etapa and fs.id_funcion=FP.ID_FUNCION and  FP.ID_RESPONSABLE="
//						+ idResponsable
//						+ " and ngf.id_nivel_gobierno=(select decode(ni.id_nivel_gobierno,1,5,ni.id_nivel_gobierno) from ejecutora ej,nivel_gobierno ni where ej.id_nivel_gobierno=ni.id_nivel_gobierno and id_ejecutora="
//						+ idAmbito + ")";
//			} else {
//				sql = "SELECT COUNT (fs.id_funcion) AS numero_funciones FROM funcion fs,etapa es,nivel_gobierno_funcion ngf WHERE fs.id_funcion=ngf.id_funcion and es.id_etapa=ngf.id_etapa and ngf.id_nivel_gobierno=(select ni.id_nivel_gobierno from ejecutora ej,nivel_gobierno ni where ej.id_nivel_gobierno=ni.id_nivel_gobierno and id_ejecutora="
//						+ idAmbito + ")";
				sql = "SELECT COUNT (fs.id_funcion) AS numero_funciones FROM funcion fs,etapa es,nivel_gobierno_funcion ngf WHERE fs.id_funcion=ngf.id_funcion and es.id_etapa=ngf.id_etapa ";
//			}
//			System.out.println("ObtenerNumeroFunciones========");
//			System.out.println(sql);
			numeroFunciones = (Integer) this.jdbcTemplate.queryForObject(sql,
					Integer.class, new Object[] {});
			return numeroFunciones;

		} catch (Exception e) {
			return null;
		}
	}

	// JZM
	public List<ResumenEtapa> ObtenerResumenEtapa(Number idEjecutora,
			Number idResponsable) {
		try {
			String sql = "";
//			if (!idResponsable.equals(0)) {
//				sql = "  SELECT SE.ID_SISTEMA_ETAPA,"
//						+ " SE.ABREV_SISTEMA_ETAPA,"
//						+ " MIN (FS.NEMOTECNICO) AS NEMOTECNICO,"
//						+ " COUNT (FS.ID_FUNCION) TOTAL_FUNCION"
//						+ " FROM FUNCION FS,"
//						+ " ETAPA ES,"
//						+ " NIVEL_GOBIERNO_FUNCION NGF,"
//						+ " FUNCION_PERSONALIZADA FP,"
//						+ " SISTEMA_ETAPA SE"
//						+ " WHERE     ES.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA"
//						+ " AND FS.ID_FUNCION = NGF.ID_FUNCION"
//						+ " AND ES.ID_ETAPA = NGF.ID_ETAPA"
//						+ " AND FS.ID_FUNCION = FP.ID_FUNCION"
//						+ " AND FP.ID_RESPONSABLE = "
//						+ idResponsable
//						+ " AND NGF.ID_NIVEL_GOBIERNO = (SELECT DECODE (NI.ID_NIVEL_GOBIERNO, 1, 5, NI.ID_NIVEL_GOBIERNO)"
//						+ " FROM EJECUTORA EJ, NIVEL_GOBIERNO NI"
//						+ " WHERE     EJ.ID_NIVEL_GOBIERNO = NI.ID_NIVEL_GOBIERNO"
//						+ " AND ID_EJECUTORA = "
//						+ idEjecutora
//						+ ")"
//						+ " GROUP BY SE.ID_SISTEMA_ETAPA, SE.ABREV_SISTEMA_ETAPA"
//						+ " ORDER BY SE.ID_SISTEMA_ETAPA";
//			} else {
//				sql = "  SELECT SE.ID_SISTEMA_ETAPA,SE.DES_SISTEMA_ETAPA ABREV_SISTEMA_ETAPA,MIN(FS.NEMOTECNICO) AS NEMOTECNICO,COUNT(FS.ID_FUNCION) TOTAL_FUNCION"
//						+ " FROM FUNCION FS,"
//						+ " ETAPA ES,"
//						+ " NIVEL_GOBIERNO_FUNCION NGF,"
//						+ " SISTEMA_ETAPA SE"
//						+ " WHERE     ES.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA"
//						+ " AND FS.ID_FUNCION = NGF.ID_FUNCION"
//						+ " AND ES.ID_ETAPA = NGF.ID_ETAPA"
//						+ " AND NGF.ID_NIVEL_GOBIERNO = (SELECT DECODE (NI.ID_NIVEL_GOBIERNO, 1, 5, NI.ID_NIVEL_GOBIERNO)"
//						+ " FROM EJECUTORA EJ, NIVEL_GOBIERNO NI"
//						+ " WHERE     EJ.ID_NIVEL_GOBIERNO = NI.ID_NIVEL_GOBIERNO"
//						+ " AND ID_EJECUTORA = "
//						+ idEjecutora
//						+ ")"
//						+ " GROUP BY SE.ID_SISTEMA_ETAPA,SE.DES_SISTEMA_ETAPA"
//						+ " ORDER BY SE.ID_SISTEMA_ETAPA";
				sql = "  SELECT SE.ID_SISTEMA_ETAPA,SE.DES_SISTEMA_ETAPA ABREV_SISTEMA_ETAPA,MIN(FS.NEMOTECNICO) AS NEMOTECNICO,COUNT(FS.ID_FUNCION) TOTAL_FUNCION"
						+ " FROM FUNCION FS,"
						+ " ETAPA ES,"
						+ " NIVEL_GOBIERNO_FUNCION NGF,"
						+ " SISTEMA_ETAPA SE"
						+ " WHERE     ES.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA"
						+ " AND FS.ID_FUNCION = NGF.ID_FUNCION"
						+ " AND ES.ID_ETAPA = NGF.ID_ETAPA"
						+ " GROUP BY SE.ID_SISTEMA_ETAPA,SE.DES_SISTEMA_ETAPA"
						+ " ORDER BY SE.ID_SISTEMA_ETAPA";
//			}
//			System.out.println("ObtenerResumenEtapa========");
//			System.out.println(sql);

			List<ResumenEtapa> listResumenEtapa = new ArrayList<ResumenEtapa>();
			ResumenEtapa resumenEtapa = null;
			List<Map<String, Object>> mapResumenEtapa = jdbcTemplate
					.queryForList(sql);
			for (Map<String, Object> rec : mapResumenEtapa) {
				resumenEtapa = new ResumenEtapa();
				resumenEtapa.setId_sistema_etapa((Number) rec
						.get("ID_SISTEMA_ETAPA"));
				resumenEtapa.setAbrev_sistema_etapa((String) rec
						.get("ABREV_SISTEMA_ETAPA"));
				resumenEtapa.setNemotecnico((String) rec.get("NEMOTECNICO"));
				resumenEtapa
						.setTotal_funcion((Number) rec.get("TOTAL_FUNCION"));
				listResumenEtapa.add(resumenEtapa);
			}
			return listResumenEtapa;
		} catch (Exception e) {
			return null;
		}
	}

	// ---jp---
	public String ObtenerEncabezadoFunciones(Integer idAmbito,
			Integer idResponsable) {
		try {
			String totalFuncionesEncabezado = "";
			String sql = "";
//			if (idResponsable != 0) {
//				sql = "SELECT fs.nemotecnico AS nemotecnico "
//						+ "FROM funcion fs,etapa es,nivel_gobierno_funcion ngf,funcion_personalizada  fp, SISTEMA_ETAPA SE "
//						+ "WHERE ES.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA AND fs.id_funcion=ngf.id_funcion and es.id_etapa=ngf.id_etapa and fs.id_funcion=FP.ID_FUNCION and  FP.ID_RESPONSABLE="
//						+ idResponsable
//						+ " and ngf.id_nivel_gobierno=(select decode(ni.id_nivel_gobierno,1,5,ni.id_nivel_gobierno) from ejecutora ej,nivel_gobierno ni where ej.id_nivel_gobierno=ni.id_nivel_gobierno and id_ejecutora="
//						+ idAmbito
//						+ ") order by se.id_sistema_etapa,fs.nemotecnico";
//			} else {
//				sql = "SELECT fs.nemotecnico AS nemotecnico "
//						+ "FROM funcion fs,etapa es,nivel_gobierno_funcion ngf, SISTEMA_ETAPA SE  "
//						+ "WHERE ES.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA AND fs.id_funcion=ngf.id_funcion and es.id_etapa=ngf.id_etapa and ngf.id_nivel_gobierno=(select ni.id_nivel_gobierno from ejecutora ej,nivel_gobierno ni where ej.id_nivel_gobierno=ni.id_nivel_gobierno and id_ejecutora="
//						+ idAmbito
//						+ ") order by se.id_sistema_etapa,fs.nemotecnico";
//			}

				sql = "SELECT fs.nemotecnico AS nemotecnico "
						+ "FROM funcion fs,etapa es,nivel_gobierno_funcion ngf, SISTEMA_ETAPA SE  "
						+ "WHERE ES.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA AND fs.id_funcion=ngf.id_funcion and es.id_etapa=ngf.id_etapa"
						+ " order by se.id_sistema_etapa,fs.nemotecnico";

//			System.out.println("ObtenerEncabezadoFunciones========");
//			System.out.println(sql);

			List<Map<String, Object>> lEntidadMaps = jdbcTemplate
					.queryForList(sql);
			// numeroFunciones = (Integer) this.jdbcTemplate.queryForObject(sql,
			// Integer.class, new Object[]{});
			for (Map<String, Object> rec : lEntidadMaps) {
				totalFuncionesEncabezado += (String) rec.get("nemotecnico")
						+ ",";
			}

			return totalFuncionesEncabezado;

		} catch (Exception e) {
			return null;
		}
	}

	/*
	 * public Sistema GetSistema(Number idSistema) { Sistema obj = null; String
	 * sql = "SELECT * from sistema where id_sistema = " + idSistema;
	 * List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);
	 * 
	 * for (Map<String, Object> rec : lEntidadMaps) { obj = new Sistema();
	 * obj.setId_sistema((Number) rec.get("ID_SISTEMA"));
	 * obj.setDescripcion((String) rec.get("DESCRIPCION"));
	 * obj.setAcronimo((String) rec.get("ACRONIMO")); obj.setCod_etapa((String)
	 * rec.get("COD_ETAPA")); obj.setPuesto_tipo((String)
	 * rec.get("PUESTO_TIPO")); obj.setFunciones((String) rec.get("FUNCIONES"));
	 * obj.setMensaje_bienvenida((String) rec.get("MENSAJE_BIENVENIDA"));
	 * obj.setAmbitos(this.ObtenerAmbitosPorSistema(obj.getId_sistema())); }
	 * return obj; }
	 */

	// ---fin---

	public Integer ObtenerNumeroPuestos_tipo(Integer idAmbito) {
		try {
			Integer numeroFunciones = 0;
			String sql = "SELECT count(PT.ID_PUESTO_TIPO) FROM PUESTO_TIPO PT, AMBITO AMB WHERE PT.ID_SISTEMA = AMB.ID_SISTEMA AND AMB.ID_AMBITO = "
					+ idAmbito;
			numeroFunciones = (Integer) this.jdbcTemplate.queryForObject(sql,
					Integer.class, new Object[] {});
			return numeroFunciones;

		} catch (Exception e) {
			return null;
		}
	}

	public Integer ObtenerIdNivelGobierno(Number idEjecutora) {
		try {
			Integer id_nivel_gobierno = 0;
			String sql = "select ni.id_nivel_gobierno from ejecutora ej,nivel_gobierno ni where ej.id_nivel_gobierno=ni.id_nivel_gobierno and id_ejecutora="
					+ idEjecutora;
			id_nivel_gobierno = (Integer) this.jdbcTemplate.queryForObject(sql,
					Integer.class, new Object[] {});
			return id_nivel_gobierno;

		} catch (Exception e) {
			return null;
		}
	}

	public String ObtenerFechaSistema() {
		try {
			String sFecha = "";
			String sql = "select to_char(sysdate,'DD/MM/YYYY') as fecha from dual";
			sFecha = (String) this.jdbcTemplate.queryForObject(sql,
					String.class, new Object[] {});
			return sFecha;

		} catch (Exception e) {
			return null;
		}
	}

	public String ObtenerFechaHoraSistema() {
		try {
			String sFecha = "";
			String sql = "select to_char(sysdate,'DD/MM/YYYY HH24:MI') as fecha from dual";
			sFecha = (String) this.jdbcTemplate.queryForObject(sql,
					String.class, new Object[] {});
			return sFecha;

		} catch (Exception e) {
			return null;
		}
	}

	public Integer numObservacion(Number idEjecutora, Number idAmbito) {
		try {
			Integer num = 0;
			String sql = "select count(sc.id_servicio_civil) from servicio_civil sc, servicio_civil_ambito amb "
					+ " where sc.id_servicio_civil = amb.id_servicio_civil and "
					+ " estado_observacion = '1' and sc.id_ejecutora = "
					+ idEjecutora.toString()
					+ " "
					+ " and amb.id_ambito = "
					+ idAmbito.toString();
			num = Integer.parseInt(this.jdbcTemplate.queryForObject(sql,
					String.class, new Object[] {}));
			return num;

		} catch (Exception e) {
			return 0;
		}
	}

	public Sistema GetSistema(Number idSistema) {
		Sistema obj = null;
		String sql = "SELECT * from sistema where id_sistema = " + idSistema;
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Sistema();
			obj.setId_sistema((Number) rec.get("ID_SISTEMA"));
			obj.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.setAcronimo((String) rec.get("ACRONIMO"));
			obj.setCod_etapa((String) rec.get("COD_ETAPA"));
			obj.setPuesto_tipo((String) rec.get("PUESTO_TIPO"));
			obj.setFunciones((String) rec.get("FUNCIONES"));
			obj.setMensaje_bienvenida((String) rec.get("MENSAJE_BIENVENIDA"));
			obj.setAmbitos(this.ObtenerAmbitosPorSistema(obj.getId_sistema()));
		}
		return obj;
	}

	public Sistema getSistema(Number idSistema, String dni, Integer idAmbito) {
		Sistema obj = null;
		String sql = "SELECT TO_CHAR(S2.FEC_CIERRE,'DD/MM/YYYY') FROM RESPONSABLE S1 "
				+ "JOIN RESPONSABLE_EJECUTORA_AMBITO S2 ON S2.ID_RESPONSABLE=S1.ID_RESPONSABLE "
				+ "WHERE S1.DNI='" + dni + "' AND S2.ID_AMBITO=" + idAmbito;
		String sFecha = (String) this.jdbcTemplate.queryForObject(sql,
				String.class, new Object[] {});
		sql = "SELECT SISTEMA.*, "
				+ "REPLACE (MENSAJE_BIENVENIDA, '{FECHA_FIN_HABILITACION}', '"
				+ sFecha + "') NUEVO_MENSAJE  from sistema where id_sistema = "
				+ idSistema;
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Sistema();
			obj.setId_sistema((Number) rec.get("ID_SISTEMA"));
			obj.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.setAcronimo((String) rec.get("ACRONIMO"));
			obj.setCod_etapa((String) rec.get("COD_ETAPA"));
			obj.setPuesto_tipo((String) rec.get("PUESTO_TIPO"));
			obj.setFunciones((String) rec.get("FUNCIONES"));
			obj.setMensaje_bienvenida((String) rec.get("NUEVO_MENSAJE"));
			obj.setAmbitos(this.ObtenerAmbitosPorSistema(obj.getId_sistema()));

		}
		return obj;
	}

	public LinkedList<Ambito> ObtenerAmbitosPorSistema(Number idSistema) {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("SELECT ID_SISTEMA, ID_AMBITO, "
						+ "DESCRIPCION, ESTADO FROM AMBITO WHERE ID_SISTEMA = "
						+ idSistema + " AND ESTADO = '1'");
		LinkedList<Ambito> obj = new LinkedList<Ambito>();
		for (Map<String, Object> rec : lSectorMaps) {
			Ambito s = new Ambito();
			s.setId_sistema((Number) rec.get("ID_SISTEMA"));
			s.setId_ambito((Number) rec.get("ID_AMBITO"));
			s.setDescripcion((String) rec.get("DESCRIPCION"));
			s.setEstado((String) rec.get("ESTADO"));
			obj.add(s);
		}
		return obj;
	}

	public Ambito GetAmbito(Number idAmbito) {
		Ambito obj = null;

		String sql = "SELECT * FROM ambito where id_ambito = " + idAmbito;
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Ambito();
			obj.setId_sistema((Number) rec.get("ID_SISTEMA"));
			obj.setId_ambito((Number) rec.get("ID_AMBITO"));
			obj.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.setEstado((String) rec.get("ESTADO"));
		}
		return obj;
	}

	public Ejecutora GetEjecutora(Number idEjecutora) {
		Ejecutora obj = null;

		String sql = "SELECT ID_EJECUTORA, ID_PLIEGO, DESCRIPCION, "
				+ " NVL(TELEFONO,'') TELEFONO, UBIGEO, UBIGEO_RPT,"
				+ " COD_ESTADO_ENVIO, ID_NIVEL_GOBIERNO, ESTADO,"
				+ " NVL(FUN_NOMBRE,'') FUN_NOMBRE, NVL(FUN_TITULO,'') FUN_TITULO, NVL(FUN_CARGO,'') FUN_CARGO,"
				+ " COD_REGIMEN, NVL(DIRECCION,'') DIRECCION, NVL(RED_SOCIAL,'') RED_SOCIAL,"
				+ " NVL(WEB,'') WEB , NVL(TIPO_RED_SOCIAL,0) TIPO_RED_SOCIAL FROM ejecutora where id_ejecutora = "
				+ idEjecutora;
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Ejecutora();

			obj.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
			obj.setId_pliego((Number) rec.get("ID_PLIEGO"));
			obj.setDescripcion((String) rec.get("DESCRIPCION"));
			if (rec.get("TELEFONO") == null)
				obj.setTelefono("");
			else
				obj.setTelefono((String) rec.get("TELEFONO"));
			obj.setUbigeo((String) rec.get("UBIGEO"));
			obj.setUbigeo_rpt((String) rec.get("UBIGEO_RPT"));
			obj.setCod_estado_envio((String) rec.get("COD_ESTADO_ENVIO"));
			obj.setId_nivel_gobierno((Number) rec.get("ID_NIVEL_GOBIERNO"));
			obj.setEstado((String) rec.get("ESTADO"));
			if (rec.get("FUN_CARGO") == null)
				obj.setFun_cargo("");
			else
				obj.setFun_cargo((String) rec.get("FUN_CARGO"));
			if (rec.get("FUN_NOMBRE") == null)
				obj.setFun_nombre("");
			else
				obj.setFun_nombre((String) rec.get("FUN_NOMBRE"));
			if (rec.get("FUN_TITULO") == null)
				obj.setFun_titulo("");
			else
				obj.setFun_titulo((String) rec.get("FUN_TITULO"));
			if (rec.get("DIRECCION") == null)
				obj.setDireccion("");
			else
				obj.setDireccion((String) rec.get("DIRECCION"));
			if (rec.get("RED_SOCIAL") == null)
				obj.setRed_social("");
			else
				obj.setRed_social((String) rec.get("RED_SOCIAL"));
			if (rec.get("WEB") == null)
				obj.setWeb("");
			else
				obj.setWeb((String) rec.get("WEB"));
			
			obj.setTipo_red_social((Number) rec.get("TIPO_RED_SOCIAL"));
		}
		return obj;
	}

	public ResponsableEjecutoraAmbito GetResponsableEjecutoraAmbito(
			Number idResponsable, Number idEjecutora, Number idAmbito) {

		ResponsableEjecutoraAmbito obj = null;

		String sql = "SELECT ID_RESPONSABLE, ID_EJECUTORA, ID_AMBITO, ESTADO, to_char(FEC_HABILITACION,'DD/MM/YYYY') as FEC_HABILITACION"
				+ ", PLAZO, ESTADO_REGISTRO, to_char(nvl(FEC_CIERRE,fec_habilitacion + plazo),'DD/MM/YYYY') as FEC_CIERRE  "
				+ " , (nvl(FEC_CIERRE,fec_habilitacion + plazo) - trunc(sysdate)) as dias_restantes "
				+ ", flg_service "
				+ " from responsable_ejecutora_ambito "
				+ " where id_responsable = "
				+ idResponsable
				+ " and id_ejecutora = "
				+ idEjecutora
				+ " and id_ambito = "
				+ idAmbito;
//		System.out.println("GetResponsableEjecutoraAmbito(Number idResponsable,Number idEjecutora, Number idAmbito)===================");
//		System.out.println(sql);
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new ResponsableEjecutoraAmbito();
			obj.setId_responsable((Number) rec.get("ID_RESPONSABLE"));
			obj.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
			obj.setId_ambito((Number) rec.get("ID_AMBITO"));
			obj.setFec_habilitacion((String) rec.get("FEC_HABILITACION"));
			obj.setPlazo((Number) rec.get("PLAZO"));
			obj.setFec_cierre((String) rec.get("FEC_CIERRE"));
			obj.setEstado((String) rec.get("ESTADO"));
			obj.setEstado_registro((String) rec.get("ESTADO_REGISTRO"));
			obj.setDias_restantes((Number) rec.get("DIAS_RESTANTES"));
			obj.setFlg_service((Number) rec.get("FLG_SERVICE"));
		}
		return obj;
	}

	public void ActualizarTelefonoEjecutora(Number idEjecutora,
			String telefonoEjecutora) {
		String sql = "UPDATE Ejecutora set Telefono = ? where id_ejecutora = ? ";
		jdbcTemplate.update(sql, telefonoEjecutora, idEjecutora);
	}

	public List<Etapa> ObtenerEtapasAmbito(Number idAmbito, Number idResponsable) {
		// Obtenemos los Sistemas y ambitos activos sobre el cual tiene acceso
		/*
		 * String sql =
		 * "Select e.id_etapa, e.descripcion as etapa, f.id_funcion, f.nemotecnico, f.descripcion as funcion "
		 * +" from etapa e join funcion f on e.id_etapa = f.id_etapa" +
		 * " where e.id_nivel_gobierno = (select id_nivel_gobierno from  responsable_ejecutora_ambito where id_ejecutora=?) "
		 * +" order by id_etapa,f.id_funcion";
		 */
		String sql = "";
//		if (!idResponsable.equals(0)) {
//			sql = "select e.id_etapa,   e.descripcion AS etapa,    f.id_funcion,    f.nemotecnico,    f.descripcion AS funcion, SE.ID_SISTEMA_ETAPA, SE.DES_SISTEMA_ETAPA, SE.ABREV_SISTEMA_ETAPA  "
//					+ " from etapa e,funcion f,nivel_gobierno_funcion ng,funcion_personalizada  fp, CENSO.SISTEMA_ETAPA SE where  "
//					+ " E.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA AND e.id_etapa=ng.id_etapa and f.id_funcion= ng.id_funcion and f.id_funcion=FP.ID_FUNCION and  FP.ID_RESPONSABLE=? "
//					+ " and ng.id_nivel_gobierno=(select ni.id_nivel_gobierno from ejecutora ej,nivel_gobierno ni where ej.id_nivel_gobierno=ni.id_nivel_gobierno and id_ejecutora=?)"
//					+ " order by se.id_sistema_etapa, f.nemotecnico";
//		} else {
			sql = "select e.id_etapa, "
					+ "  e.descripcion AS etapa, "
					+ "   f.id_funcion, "
					+ "   f.nemotecnico, "
					+ "   f.descripcion AS funcion , SE.ID_SISTEMA_ETAPA, SE.DES_SISTEMA_ETAPA, SE.ABREV_SISTEMA_ETAPA from etapa e,funcion f,nivel_gobierno_funcion ng, CENSOABAST.SISTEMA_ETAPA SE"
					+ " where E.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA AND  e.id_etapa=ng.id_etapa and f.id_funcion= ng.id_funcion "
					+ " order by se.id_sistema_etapa, f.nemotecnico";
//		}
//		System.out.println("ObtenerEtapasAmbito===================");
//		System.out.println(sql);

		List<Map<String, Object>> lSectorMaps = null;
		lSectorMaps = jdbcTemplate.queryForList(sql);
//		if (idResponsable.equals(0)) {
//			lSectorMaps = jdbcTemplate.queryForList(sql, idAmbito, idAmbito);
//		} else {
//			lSectorMaps = jdbcTemplate.queryForList(sql, idResponsable,
//					idAmbito);
//		}

		Number id_etapa_antes = 0;
		Number id_etapa = 0;
		Etapa etapa = null;
		FuncionLeyenda funcion = null;
		List<Etapa> etapasAmbito = new ArrayList<Etapa>();
		for (Map<String, Object> rec : lSectorMaps) {
			id_etapa = (Number) rec.get("ID_ETAPA");
			if (id_etapa.intValue() != id_etapa_antes.intValue()) {
				etapa = new Etapa();
				etapa.setId_etapa((Number) rec.get("ID_ETAPA"));
				etapa.setId_ambito(idAmbito);
				etapa.setDescripcion((String) rec.get("ETAPA"));
				etapa.setAbrev_sistema_etapa((String) rec
						.get("ABREV_SISTEMA_ETAPA"));
				etapa.setDes_sistema_etapa((String) rec
						.get("DES_SISTEMA_ETAPA"));
				etapa.setId_sistema_etapa((Number) rec.get("ID_SISTEMA_ETAPA"));
				etapa.setDescripcion_etapa_sistema(etapa
						.getAbrev_sistema_etapa()
						+ "-"
						+ etapa.getDescripcion());
				etapa.setFunciones(new ArrayList<FuncionLeyenda>());

				etapasAmbito.add(etapa);
			}
			funcion = new FuncionLeyenda();
			funcion.setId_etapa((Number) rec.get("ID_ETAPA"));
			funcion.setId_funcion((Number) rec.get("ID_FUNCION"));
			funcion.setDescripcion((String) rec.get("FUNCION"));
			funcion.setNemotecnico((String) rec.get("NEMOTECNICO"));

			etapa.getFunciones().add(funcion);
			etapa.setNro_funciones(etapa.getFunciones().size());

			id_etapa_antes = id_etapa;
		}
		return etapasAmbito;
	}

	public List<Etapa> ObtenerEtapasAmbito(Number idAmbito,
			Number idResponsable, String isFuncionesPersonalizadas, Number id_sistema_etapa) {
		// Obtenemos los Sistemas y ambitos activos sobre el cual tiene acceso
		/*
		 * String sql =
		 * "Select e.id_etapa, e.descripcion as etapa, f.id_funcion, f.nemotecnico, f.descripcion as funcion "
		 * +" from etapa e join funcion f on e.id_etapa = f.id_etapa" +
		 * " where e.id_nivel_gobierno = (select id_nivel_gobierno from  responsable_ejecutora_ambito where id_ejecutora=?) "
		 * +" order by id_etapa,f.id_funcion";
		 */
		String sql = "";
		if (isFuncionesPersonalizadas.equals("1")) {
			sql = "select e.id_etapa,   e.descripcion AS etapa,    f.id_funcion,    f.nemotecnico,    f.descripcion AS funcion, SE.ID_SISTEMA_ETAPA, SE.DES_SISTEMA_ETAPA, SE.ABREV_SISTEMA_ETAPA  "
					+ " from etapa e,funcion f,nivel_gobierno_funcion ng,funcion_personalizada  fp, CENSOABAST.SISTEMA_ETAPA SE where  "
					+ " E.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA AND e.id_etapa=ng.id_etapa and f.id_funcion= ng.id_funcion and f.id_funcion=FP.ID_FUNCION and  FP.ID_RESPONSABLE = "+idResponsable
					+ " and ng.id_nivel_gobierno=(select ni.id_nivel_gobierno from ejecutora ej,nivel_gobierno ni where ej.id_nivel_gobierno=ni.id_nivel_gobierno and id_ejecutora="+idAmbito+")"
					+ "AND SE.ID_SISTEMA_ETAPA = " + id_sistema_etapa
					+ " order by se.id_sistema_etapa, f.nemotecnico";
			sql = "select e.id_etapa,   e.descripcion AS etapa,    f.id_funcion,    f.nemotecnico,    f.descripcion AS funcion, SE.ID_SISTEMA_ETAPA, SE.DES_SISTEMA_ETAPA, SE.ABREV_SISTEMA_ETAPA  "
					+ " from etapa e,funcion f,nivel_gobierno_funcion ng, CENSOABAST.SISTEMA_ETAPA SE where  "
					+ " E.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA AND e.id_etapa=ng.id_etapa and f.id_funcion= ng.id_funcion " //and f.id_funcion=FP.ID_FUNCION and  FP.ID_RESPONSABLE = "+idResponsable
					+ " and ng.id_nivel_gobierno=(select ni.id_nivel_gobierno from ejecutora ej,nivel_gobierno ni where ej.id_nivel_gobierno=ni.id_nivel_gobierno and id_ejecutora="+idAmbito+")"
					+ "AND SE.ID_SISTEMA_ETAPA = " + id_sistema_etapa
					+ " order by se.id_sistema_etapa, f.nemotecnico";
		} else {
			sql = "select e.id_etapa, "
					+ "  e.descripcion AS etapa, "
					+ "   f.id_funcion, "
					+ "   f.nemotecnico, "
					+ "   f.descripcion AS funcion , SE.ID_SISTEMA_ETAPA, SE.DES_SISTEMA_ETAPA, SE.ABREV_SISTEMA_ETAPA from etapa e,funcion f,nivel_gobierno_funcion ng, CENSOABAST.SISTEMA_ETAPA SE"
					+ " where E.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA AND  e.id_etapa=ng.id_etapa and f.id_funcion= ng.id_funcion "
					+ " and ng.id_nivel_gobierno=(select ni.id_nivel_gobierno from ejecutora ej,nivel_gobierno ni where ej.id_nivel_gobierno=ni.id_nivel_gobierno and id_ejecutora="+idAmbito+")"
					//+ " AND (E.ID_SISTEMA_ETAPA = 3 OR E.ID_SISTEMA_ETAPA = 2 OR E.ID_SISTEMA_ETAPA = (SELECT ID_SISTEMA_ETAPA FROM RESPONSABLE WHERE ID_RESPONSABLE = (SELECT ID_RESPONSABLE FROM RESPONSABLE_EJECUTORA_AMBITO WHERE ID_EJECUTORA = ?)))"
					+ " order by se.id_sistema_etapa, f.nemotecnico";
		}
//		System.out.println("ObtenerEtapasAmbito===================");
//		System.out.println(sql);

		List<Map<String, Object>> lSectorMaps = null;

//		if (idResponsable.equals(0)) {
//			lSectorMaps = jdbcTemplate.queryForList(sql, idAmbito, idAmbito);
//		} else {
			lSectorMaps = jdbcTemplate.queryForList(sql);
//		}

		Number id_etapa_antes = 0;
		Number id_etapa = 0;
		Etapa etapa = null;
		FuncionLeyenda funcion = null;
		List<Etapa> etapasAmbito = new ArrayList<Etapa>();
		for (Map<String, Object> rec : lSectorMaps) {
			id_etapa = (Number) rec.get("ID_ETAPA");
			if (id_etapa.intValue() != id_etapa_antes.intValue()) {
				etapa = new Etapa();
				etapa.setId_etapa((Number) rec.get("ID_ETAPA"));
				etapa.setId_ambito(idAmbito);
				etapa.setDescripcion((String) rec.get("ETAPA"));
				etapa.setAbrev_sistema_etapa((String) rec
						.get("ABREV_SISTEMA_ETAPA"));
				etapa.setDes_sistema_etapa((String) rec
						.get("DES_SISTEMA_ETAPA"));
				etapa.setId_sistema_etapa((Number) rec.get("ID_SISTEMA_ETAPA"));
				etapa.setDescripcion_etapa_sistema(etapa
						.getAbrev_sistema_etapa()
						+ "-"
						+ etapa.getDescripcion());
				etapa.setFunciones(new ArrayList<FuncionLeyenda>());

				etapasAmbito.add(etapa);
			}
			funcion = new FuncionLeyenda();
			funcion.setId_etapa((Number) rec.get("ID_ETAPA"));
			funcion.setId_funcion((Number) rec.get("ID_FUNCION"));
			funcion.setDescripcion((String) rec.get("FUNCION"));
			funcion.setNemotecnico((String) rec.get("NEMOTECNICO"));

			etapa.getFunciones().add(funcion);
			etapa.setNro_funciones(etapa.getFunciones().size());

			id_etapa_antes = id_etapa;
		}
		return etapasAmbito;
	}

	public Integer AplicaFuncionesPersonalizadas(Number idResponsable) {
		try {
			Integer aplicaFuncionPersonalizada = 0;
			String sql = "select distinct(id_responsable) from funcion_personalizada where id_responsable="
					+ idResponsable;
//			System.out
//					.println("AplicaFuncionesPersonalizadas(Number idResponsable) ============");
//			System.out.println(sql);
			aplicaFuncionPersonalizada = Integer
					.parseInt((String) this.jdbcTemplate.queryForObject(sql,
							String.class, new Object[] {}));
			return aplicaFuncionPersonalizada;

		} catch (Exception e) {
			return 0;
		}
	}

	/*
	 * public List<Etapa> ObtenerEtapasAmbito(Number idAmbito){ //Obtenemos los
	 * Sistemas y ambitos activos sobre el cual tiene acceso String sql =
	 * "Select e.id_etapa, e.descripcion as etapa, f.id_funcion, f.nemotecnico, f.descripcion as funcion "
	 * +" from etapa e join funcion f on e.id_etapa = f.id_etapa"
	 * +" where e.id_ambito = ? " +" order by id_etapa,f.id_funcion";
	 * System.out.println("ObtenerEtapasAmbito===================");
	 * System.out.println(sql); List<Map<String, Object>> lSectorMaps =
	 * jdbcTemplate.queryForList(sql,idAmbito);
	 * 
	 * Number id_etapa_antes = 0; Number id_etapa = 0; Etapa etapa = null;
	 * FuncionLeyenda funcion = null; List<Etapa> etapasAmbito = new
	 * ArrayList<Etapa>(); for(Map<String, Object> rec : lSectorMaps){ id_etapa
	 * = (Number)rec.get("ID_ETAPA"); if (id_etapa.intValue() !=
	 * id_etapa_antes.intValue()) { etapa = new Etapa();
	 * etapa.setId_etapa((Number)rec.get("ID_ETAPA"));
	 * etapa.setId_ambito(idAmbito);
	 * etapa.setDescripcion((String)rec.get("ETAPA")); etapa.setFunciones(new
	 * ArrayList<FuncionLeyenda>());
	 * 
	 * etapasAmbito.add(etapa); } funcion = new FuncionLeyenda();
	 * funcion.setId_etapa((Number)rec.get("ID_ETAPA"));
	 * funcion.setId_funcion((Number)rec.get("ID_FUNCION"));
	 * funcion.setDescripcion((String)rec.get("FUNCION"));
	 * funcion.setNemotecnico((String)rec.get("NEMOTECNICO"));
	 * 
	 * etapa.getFunciones().add(funcion);
	 * etapa.setNro_funciones(etapa.getFunciones().size());
	 * 
	 * id_etapa_antes = id_etapa; } return etapasAmbito; }
	 */
	public void FinalizarInscripcionParticipantes(Number idResponsable,
			Number idEjecutora, Number idAmbito) {

		// Actualizamos el estado de todos los participantes
		String sql = "UPDATE servicio_civil set COD_ESTADO = 'CONF', estado_observacion = '0' where id_ejecutora = ? and cod_estado in ('INIC','OBSE') "
				+ " and id_servicio_civil in (SELECT id_servicio_civil FROM servicio_civil_ambito where id_ambito = ?)";
		jdbcTemplate.update(sql, idEjecutora, idAmbito);

		// Actualizamos el estado del responsable por ambito
		sql = "update responsable_ejecutora_ambito set estado_registro = '2', FEC_FIN_CENSO=SYSDATE where id_responsable = ? and id_ejecutora = ? and id_ambito = ? ";
		jdbcTemplate.update(sql, idResponsable, idEjecutora, idAmbito);
	}

	public void enviaCorreoFinCenso(Number idResponsable, Number idSistema,
			Number idAmbito) {
		String sql = "";
		try {
			sql = "{call MAIL_CENSO.CORREO_FIN_CENSO(?,?,?,?,?,?,?)}";
			conn = this.dataSourceCenso.getConnection();
			callableStatement = conn.prepareCall(sql);

			callableStatement.setInt(1, idResponsable.intValue());
			callableStatement.setInt(2, idSistema.intValue());
			callableStatement.setInt(3, idAmbito.intValue());
			callableStatement.registerOutParameter(4, java.sql.Types.VARCHAR); // PSENDER
			callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); // PRECIPIENT
			callableStatement.registerOutParameter(6, java.sql.Types.VARCHAR); // PSUBJECT
			callableStatement.registerOutParameter(7, java.sql.Types.CLOB); // PCONTENIDOFINAL
			callableStatement.executeUpdate();

//			System.out.println("=========== Enviando correo con los datos ==========");
//			System.out.println("call MAIL_CENSO.CORREO_FIN_CENSO");
//			System.out.println("idResponsable = " + idResponsable);
//			System.out.println("idSistema = " + idSistema);
//			System.out.println("idAmbito = " + idAmbito);

			// Se activa el env�o del correo a trav�s de Java
			SMTPSend.Mail(callableStatement.getString(6),
					callableStatement.getString(7),
					callableStatement.getString(5));
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (!(callableStatement == null)) {
				try {
					callableStatement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (!(conn == null)) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	public List<ResponsableEjecutoraAmbito> ObtenerAmbitosResponsable(
			Number idResponsable) {

		List<ResponsableEjecutoraAmbito> list = new LinkedList<ResponsableEjecutoraAmbito>();

		String sql = "SELECT ID_RESPONSABLE, ID_EJECUTORA, ID_AMBITO, ESTADO, to_char(FEC_HABILITACION,'DD/MM/YYYY') as FEC_HABILITACION"
				+ ", PLAZO, ESTADO_REGISTRO, to_char(nvl(FEC_CIERRE,fec_habilitacion + plazo),'DD/MM/YYYY') as FEC_CIERRE  "
				+ " , (nvl(FEC_CIERRE,fec_habilitacion + plazo) - trunc(sysdate)) as dias_restantes "
				+ " from responsable_ejecutora_ambito "
				+ " where id_responsable = ? ";
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql,
				idResponsable);

		for (Map<String, Object> rec : lEntidadMaps) {
			ResponsableEjecutoraAmbito obj = new ResponsableEjecutoraAmbito();
			obj.setId_responsable((Number) rec.get("ID_RESPONSABLE"));
			obj.setId_ejecutora((Number) rec.get("ID_EJECUTORA"));
			obj.setId_ambito((Number) rec.get("ID_AMBITO"));
			obj.setFec_habilitacion((String) rec.get("FEC_HABILITACION"));
			obj.setPlazo((Number) rec.get("PLAZO"));
			obj.setFec_cierre((String) rec.get("FEC_CIERRE"));
			obj.setEstado((String) rec.get("ESTADO"));
			obj.setEstado_registro((String) rec.get("ESTADO_REGISTRO"));
			obj.setDias_restantes((Number) rec.get("DIAS_RESTANTES"));

			list.add(obj);
		}
		return list;
	}

	public List<PuestoTipo> getPuestoTipos(Number idSistema) {
		List<PuestoTipo> list = new LinkedList<PuestoTipo>();

		String sql = "SELECT ID_PUESTO_TIPO,ID_SISTEMA,PUESTO_TIPO,ESTADO,USUARIO_ACT,to_char(FEC_ACT,'DD/MM/YYYY') as FEC_ACT,COD_GRUPO"
				+ " FROM PUESTO_TIPO WHERE ID_SISTEMA = " + idSistema;

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString());
//		System.out.println("List<PuestoTipo> getPuestoTipos(Number idSistema)");
//		System.out.println(sql);
		for (Map<String, Object> rec : collec) {
			PuestoTipo obj = new PuestoTipo();
			obj.setId_puesto_tipo((Number) rec.get("ID_PUESTO_TIPO"));
			obj.setId_sistema((Number) rec.get("ID_SISTEMA"));
			obj.setPuesto_tipo((String) rec.get("PUESTO_TIPO"));
			obj.setEstado((String) rec.get("ESTADO"));
			obj.setUsuario_act((String) rec.get("USUARIO_ACT"));
			obj.setFec_act((String) rec.get("FEC_ACT"));
			obj.setCod_grupo((String) rec.get("COD_GRUPO"));

			if (!"RESPONSABLE DE OPI".equals((String) rec.get("PUESTO_TIPO"))) {
				list.add(obj);
			}
		}
		return list;
	}
	
	public PuestoTipo getPuestoTipo(Number idPuestoTipo) {
		PuestoTipo obj = null;

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_PUESTO_TIPO,ID_SISTEMA,PUESTO_TIPO,ESTADO,USUARIO_ACT,to_char(FEC_ACT,'DD/MM/YYYY') as FEC_ACT,COD_GRUPO");
		sql.append(" FROM PUESTO_TIPO WHERE ID_PUESTO_TIPO = " + idPuestoTipo);

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString());
		for (Map<String, Object> rec : collec) {
			obj = new PuestoTipo();
			obj.setId_puesto_tipo((Number) rec.get("ID_PUESTO_TIPO"));
			obj.setId_sistema((Number) rec.get("ID_SISTEMA"));
			obj.setPuesto_tipo((String) rec.get("PUESTO_TIPO"));
			obj.setEstado((String) rec.get("ESTADO"));
			obj.setUsuario_act((String) rec.get("USUARIO_ACT"));
			obj.setFec_act((String) rec.get("FEC_ACT"));
			obj.setCod_grupo((String) rec.get("COD_GRUPO"));
		}
		return obj;
	}

	public Integer getIdPuestoOperador(Number idSistema) {
		try {
			Integer num = 0;
			String sql = "select id_puesto_tipo from puesto_tipo where trim(puesto_tipo)='OPERADOR' AND id_sistema = "
					+ idSistema;
			num = Integer.parseInt(this.jdbcTemplate.queryForObject(sql,
					String.class, new Object[] {}));
			return num;

		} catch (Exception e) {
			return 0;
		}
	}

	public String esJefePuestoTipo(Number idPuestoTipo) {
		StringBuilder sql = new StringBuilder();
		sql.append("select nvl(max(case cod_grupo when 'J' then '1' else '0' end),'0') as Jefe from puesto_tipo where id_puesto_tipo = ?");
		return jdbcTemplate.queryForObject(sql.toString(), String.class,
				idPuestoTipo);

	}

	public Sistema getSistema(Integer idSistema) {
		Sistema obj = null;

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_SISTEMA,DESCRIPCION,ACRONIMO,COD_ETAPA,CON_AMBITOS, PUESTO_TIPO, FUNCIONES, to_char(fec_fin_habilitacion, 'dd/mm/yyyy') as FEC_FIN_HABILITACION ");
		sql.append(" FROM SISTEMA WHERE ID_SISTEMA = ? ");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(
				sql.toString(), idSistema);
		for (Map<String, Object> rec : collec) {
			obj = new Sistema();
			obj.setId_sistema((Number) rec.get("ID_SISTEMA"));
			obj.setDescripcion((String) rec.get("DESCRIPCION"));
			obj.setAcronimo((String) rec.get("ACRONIMO"));
			obj.setCod_etapa((String) rec.get("COD_ETAPA"));
			obj.setCon_ambitos((String) rec.get("CON_AMBITOS"));
			obj.setPuesto_tipo((String) rec.get("PUESTO_TIPO"));
			obj.setFunciones((String) rec.get("FUNCIONES"));
			obj.setFec_fin_habilitacion((String) rec
					.get("FEC_FIN_HABILITACION"));
		}
		return obj;

	}

	public Integer getIdResponsable(String dni, Number idEjecutora) {
		try {
			Integer num = 0;
			String sql = "SELECT res.ID_RESPONSABLE FROM RESPONSABLE res, RESPONSABLE_EJECUTORA_AMBITO ree WHERE res.ID_RESPONSABLE=ree.ID_RESPONSABLE"
					+ " and ID_EJECUTORA="
					+ idEjecutora
					+ " AND res.DNI="
					+ dni;
			num = Integer.parseInt(this.jdbcTemplate.queryForObject(sql,
					String.class, new Object[] {}));
			return num;

		} catch (Exception e) {
			return 0;
		}
	}

	public String getJefe(String dni, Number idResponsable) {
		try {
			String num = "";
			String sql = "SELECT sc.JEFE FROM SERVICIO_CIVIL sc WHERE sc.dni = "
					+ dni + " and sc.id_responsable= " + idResponsable;
			num = (this.jdbcTemplate.queryForObject(sql, String.class,
					new Object[] {}));
			return num;

		} catch (Exception e) {
			return null;
		}
	}

	public void actualizarResponsableEjecutoraAmbito(
			ResponsableEjecutoraAmbito responsableEjecutoraAmbito) {
		String sql = "UPDATE RESPONSABLE_EJECUTORA_AMBITO SET "
				+ " FLG_SERVICE = "
				+ responsableEjecutoraAmbito.getFlg_service() + " WHERE "
				+ " ID_RESPONSABLE = "
				+ responsableEjecutoraAmbito.getId_responsable()
				+ " AND ID_EJECUTORA = "
				+ responsableEjecutoraAmbito.getId_ejecutora()
				+ " AND ID_AMBITO = "
				+ responsableEjecutoraAmbito.getId_ambito();
		jdbcTemplate.update(sql);
	}

	@Override
	public LinkedList<SistemaEtapa> ObtenerSistemaEtapa(Number idResponsable) {
		String sql = "";
		sql = "  SELECT DISTINCT SE.ID_SISTEMA_ETAPA,"
				+ " SE.DES_SISTEMA_ETAPA,"
				+ " SE.ABREV_SISTEMA_ETAPA,"
				+ " SE.ID_AMBITO"
				+ " FROM CENSOABAST.SISTEMA_ETAPA SE"
				+ " JOIN ETAPA ET ON ET.ID_SISTEMA_ETAPA = SE.ID_SISTEMA_ETAPA"
				+ " JOIN FUNCION F ON F.ID_ETAPA = ET.ID_ETAPA"
				+ " JOIN FUNCION_PERSONALIZADA FP ON FP.ID_FUNCION = F.ID_FUNCION"
				+ " WHERE FP.ID_RESPONSABLE = " + idResponsable
				+ " ORDER BY ABREV_SISTEMA_ETAPA";
//		System.out.println("LinkedList<SistemaEtapa> ObtenerSistemaEtapa()");
//		System.out.println("==============================================");
//		System.out.println(sql);
		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<SistemaEtapa> obj = new LinkedList<SistemaEtapa>();
		for (Map<String, Object> rec : lSectorMaps) {
			SistemaEtapa s = new SistemaEtapa();
			s.setId_sistema_etapa((Number) rec.get("id_sistema_etapa"));
			s.setDes_sistema_etapa((String) rec.get("des_sistema_etapa"));
			s.setAbrev_sistema_etapa((String) rec.get("abrev_sistema_etapa"));
			s.setId_ambito((Number) rec.get("id_ambito"));
			obj.add(s);
		}
		return obj;
	}

	@Override
	public LinkedList<SistemaEtapa> ObtenerSistemaEtapa() {
		String sql = "";
		sql = "select id_sistema_etapa, des_sistema_etapa, abrev_sistema_etapa, id_ambito "
				+ " from CENSOABAST.sistema_etapa order by id_sistema_etapa";
//		System.out.println("LinkedList<SistemaEtapa> ObtenerSistemaEtapa()");
//		System.out.println("==============================================");
//		System.out.println(sql);
		List<Map<String, Object>> lSectorMaps = jdbcTemplate.queryForList(sql);
		LinkedList<SistemaEtapa> obj = new LinkedList<SistemaEtapa>();
		for (Map<String, Object> rec : lSectorMaps) {
			SistemaEtapa s = new SistemaEtapa();
			s.setId_sistema_etapa((Number) rec.get("id_sistema_etapa"));
			s.setDes_sistema_etapa((String) rec.get("des_sistema_etapa"));
			s.setAbrev_sistema_etapa((String) rec.get("abrev_sistema_etapa"));
			s.setId_ambito((Number) rec.get("id_ambito"));
			obj.add(s);
		}
		return obj;
	}

	@Override
	public void actualizaEjecutora(Ejecutora ejecutora) {
			String sql = "UPDATE EJECUTORA SET "
					+ " DIRECCION = '"
					+ ejecutora.getDireccion() + "'"
					+ " ,TELEFONO = '"
					+ ejecutora.getTelefono() + "'"
					+ " ,FUN_NOMBRE = '"
					+ ejecutora.getFun_nombre() + "'"
					+ " ,FUN_TITULO = '"
					+ ejecutora.getFun_titulo() + "'"
					+ " ,FUN_CARGO = '"
					+ ejecutora.getFun_cargo() + "'"
					+ " ,RED_SOCIAL = '"
					+ ejecutora.getRed_social() + "'"
					+ " ,WEB = '"
					+ ejecutora.getWeb() + "'"
					+ " ,TIPO_RED_SOCIAL = "
					+ ejecutora.getTipo_red_social()
					+ " WHERE "
					+ " ID_EJECUTORA = "
					+ ejecutora.getId_ejecutora();
			jdbcTemplate.update(sql);
	}
	
	public List<Universidad> getUniversidades() {
		List<Map<String, Object>> lSectorMaps = jdbcTemplate
				.queryForList("SELECT ID_UNIVERSIDAD, DES_UNIVERSIDAD FROM CENSOABAST.UNIVERSIDAD ORDER BY DES_UNIVERSIDAD");
		List<Universidad> obj = new ArrayList<Universidad>();
		for (Map<String, Object> rec : lSectorMaps) {
			Universidad s = new Universidad();
			s.setId_universidad((Number) rec.get("ID_UNIVERSIDAD"));
			s.setDes_universidad((String) rec.get("DES_UNIVERSIDAD"));
			obj.add(s);
		}
		return obj;
	}
}